iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0

前面講過我們換了三次地區,最後落在日本。

地端那條隧道不用重建。strongSwan 早就裝在那台機器上,日本這條只是把原本指向新加坡的設定改個方向,實際要動的只有三個值:對方的公網 IP、對方的識別身分、還有那組共用密碼。

前兩個其實填的是同一串位址,只是用途不同:一個是「要把封包送去哪」,一個是「對方宣稱自己是誰」。閘道換到日本,等於那台機器換了一台,這串位址自然要跟著換。

其他全部不動,包括路由器上那條靜態路由。因為日本沿用了新加坡原本那個網段,對地端來說「往這個網段的封包交給那台機器」這件事完全沒變。

這裡有個容易混淆的地方值得先分清楚:換掉的是身分(那台機器在網際網路上的門牌),沿用的是網段(它背後那片內網)。門牌換了,但門後面的房間編號沒變,所以地端的路由表可以完全不動。這是 Day 5 那篇規劃網段的回報:當初把網段錯開、而且一個環境固定一段,換地區的時候才有辦法只改三個值。

動手之前,我把兩個設定檔各複製一份 .bak。這個習慣的用處不在還原,而在於出事的時候可以比對一下,確認自己到底改了什麼。

我改完,重新載入設定,然後隧道連不起來。

症狀

診斷紀錄裡的訊息大致是這樣:

IKE_SA_INIT   成功
IKE_AUTH      AUTHENTICATION_FAILED

我當時完全看不懂這代表什麼。

訊息本身其實很誠實,是我讀不懂它的結構。

AUTHENTICATION_FAILED 這個字看起來夠明確了,但它只講了「驗證沒過」,沒講是哪一邊、哪個值、為什麼沒過。真正讓我卡住的是上面那一行:它寫著成功。同一條連線,怎麼會前面成功、後面失敗?

問題出在我把這兩行當成同一件事的兩次結果。它們不是。

https://ithelp.ithome.com.tw/upload/images/20260923/20178656OBm2EBwmMi.jpg

這兩行在講什麼

後來搞懂了,IPsec 建立隧道分成兩個階段,而這兩行剛好對應那兩個階段。

第一階段(IKE_SA_INIT)在談加密方式。 兩邊互相說「我支援這些演算法,你呢」,然後挑一個雙方都會的。這階段成功,代表兩件事都沒問題:網路是通的(封包送得到對方),而且加密參數是相容的。

第二階段(IKE_AUTH)在驗身分。 這時候才拿出那組共用密碼對暗號,確認對方真的是自己要連的人。

所以「第一階段過、第二階段掛」這個組合,其實已經把答案講出來了:

網路沒問題、演算法沒問題,是身分驗證沒過。

而身分驗證只跟兩件事有關:密碼對不對、以及雙方宣稱的身分對不對。

前天講 PSK 的時候提過一句「密碼錯了的症狀會是認證失敗,不是連不上」。這兩行就是那句話的實際樣子。

真正的原因

密碼我明明改了。檔案打開來看,裡面就是新的那一組。問題在於我用錯了重新載入的指令。

我下的是 ipsec reload。它只會重新讀取 /etc/ipsec.conf,也就是「要連到哪、網段是什麼」那些連線定義。它不會去碰放密碼的 /etc/ipsec.secrets。

所以當下的狀態是:連線定義已經指向日本了,但記憶體裡的密碼還是新加坡那一組舊的。檔案上是對的,跑起來是錯的。

https://ithelp.ithome.com.tw/upload/images/20260923/20178656QayVlm75MS.jpg

正確的做法是另外下 ipsec rereadsecrets,這個指令專門重讀密碼檔,然後再 ipsec down / ipsec up 把那條隧道關掉重開。

這個行為其實不算 bug。連線定義和密碼被拆成兩個檔案,本來就是因為它們的保管方式不同:連線定義可以放進版本控制、可以貼在文件裡,密碼不行。既然分開存,重新載入的時候也就分開處理。那個指令沒有騙我,是我以為「載入設定」會載入全部的設定。

密碼不是單獨存在的

還有一件事值得補:放密碼的那個檔案,裡面不是只有密碼。

一行的結構大概長這樣:

<我這邊的身分> <對方的身分> : PSK "<密碼>"

前面那兩個欄位是給 strongSwan 查表用的。一台機器上可能同時掛著好幾條隧道,我們那台就同時有測試和生產兩條,對象不同、密碼也不同。它得先知道「這次是誰在跟誰講話」,才能挑出對應的那一組。

這代表兩種不同的錯會撞在同一個訊息上:密碼填錯,還有身分填錯、導致根本查不到密碼。後者更難察覺,因為你檔案裡的密碼確實是新的,只是它被登記在另一個對象名下。

而換地區的時候,「對方的身分」剛好也是要改的那三個值之一。

一條可以帶走的判讀規則

這件事最有價值的不是「該用哪個指令」,而是那兩行紀錄教我的判斷方式:

第一階段過、第二階段掛 → 幾乎一定是身分驗證的問題(密碼或身分設定不符),跟網路和加密無關。

這條規則的用處在於它幫你排除掉一大片。VPN 連不上的時候,可能的原因很多:防火牆沒開、埠沒通、對方位址錯了、演算法不相容、密碼不對。一個一個試會很久。

但只要第一階段是成功的,前面那幾項就全部可以先放下,直接去看密碼和身分。

我後來把這句話寫進 runbook 裡,因為半年後的自己一定會忘記。

帶得走的東西

「我改了設定檔」和「系統正在用新的設定」是兩件事。

中間隔著一個「重新載入」的動作,而那個動作往往不是全有全無的。有些設定重載會生效,有些要重啟,有些要另外下指令。你看著檔案裡的新值,很容易以為系統也在用新值。

這件事我在這個專案裡遇到不只一次。後面講資料庫參數的時候還會再碰到一次,那次更隱蔽,因為它連錯誤訊息都沒有。


明天講另一種「以為通了其實沒通」:兩個網路明明已經接起來、IP 也 ping 得到,但服務要用的東西還差一步。因為網路通和名字查得到,是兩件不同的事。


上一篇
Day 8:打通雲地網路(下)為什麼只有一台機器連得到
下一篇
Day 10:網路通了,但名字查不到
系列文
菜鳥工程師的 DR 告白:混合雲異地備援,與資料庫回家的那 12 分鐘 共 10 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言